/*
* Copyright 1998-2016 Linux.org.ru
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.org.linux.user;
import com.google.common.collect.ImmutableMap;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nonnull;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@Repository
public class UserLogDao {
public static final String OPTION_OLD_USERPIC = "old_userpic";
public static final String OPTION_NEW_USERPIC = "new_userpic";
public static final String OPTION_BONUS = "bonus";
public static final String OPTION_REASON = "reason";
public static final String OPTION_OLD_EMAIL = "old_email";
public static final String OPTION_NEW_EMAIL = "new_email";
public static final String OPTION_OLD_INFO = "old_info";
public static final String OPTION_IP = "ip";
private JdbcTemplate jdbcTemplate;
@Autowired
private void setDataSource(DataSource ds) {
jdbcTemplate = new JdbcTemplate(ds);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logResetUserpic(@Nonnull User user, @Nonnull User actionUser, int bonus) {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
if (bonus!=0) {
builder.put(OPTION_BONUS, bonus);
}
if (user.getPhoto()!=null) {
builder.put(OPTION_OLD_USERPIC, user.getPhoto());
}
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
actionUser.getId(),
UserLogAction.RESET_USERPIC.toString(),
builder.build()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logSetUserpic(@Nonnull User user, @Nonnull String userpic) {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
if (user.getPhoto()!=null) {
builder.put(OPTION_OLD_USERPIC, user.getPhoto());
}
builder.put(OPTION_NEW_USERPIC, userpic);
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
user.getId(),
UserLogAction.SET_USERPIC.toString(),
builder.build()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logBlockUser(@Nonnull User user, @Nonnull User moderator, @Nonnull String reason) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.BLOCK_USER.toString(),
ImmutableMap.of(OPTION_REASON, reason)
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logScore50(@Nonnull User user, @Nonnull User moderator) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, '')",
user.getId(),
moderator.getId(),
UserLogAction.SCORE50.toString()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logUnblockUser(@Nonnull User user, @Nonnull User moderator) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.UNBLOCK_USER.toString(),
ImmutableMap.of()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logAcceptNewEmail(@Nonnull User user, @Nonnull String newEmail) {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
builder.put(OPTION_NEW_EMAIL, newEmail);
if (user.getEmail()!=null) {
builder.put(OPTION_OLD_EMAIL, user.getEmail());
}
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
user.getId(),
UserLogAction.ACCEPT_NEW_EMAIL.toString(),
builder.build()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logResetInfo(@Nonnull User user, @Nonnull User moderator, @Nonnull String userInfo, int bonus) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.RESET_INFO.toString(),
ImmutableMap.of(
OPTION_OLD_INFO, userInfo,
OPTION_BONUS, bonus
)
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logResetPassword(@Nonnull User user, @Nonnull User moderator) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.RESET_PASSWORD.toString(),
ImmutableMap.of()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logSetPassword(@Nonnull User user) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
user.getId(),
UserLogAction.SET_PASSWORD.toString(),
ImmutableMap.of()
);
}
@Nonnull
public List<UserLogItem> getLogItems(@Nonnull User user, boolean includeSelf) {
String sql =
includeSelf ?
"SELECT id, userid, action_userid, action_date, action, info FROM user_log WHERE userid=? ORDER BY id DESC"
:
"SELECT id, userid, action_userid, action_date, action, info FROM user_log WHERE userid=? AND userid!=action_userid ORDER BY id DESC";
return jdbcTemplate.query(
sql,
new RowMapper<UserLogItem>() {
@Override
public UserLogItem mapRow(ResultSet rs, int rowNum) throws SQLException {
return new UserLogItem(
rs.getInt("id"),
rs.getInt("userid"),
rs.getInt("action_userid"),
new DateTime(rs.getTimestamp("action_date")),
UserLogAction.valueOf(rs.getString("action").toUpperCase()),
(Map<String, String>) rs.getObject("info")
);
}
},
user.getId()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void logRegister(int userid, @Nonnull String ip) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
userid,
userid,
UserLogAction.REGISTER.toString(),
ImmutableMap.of(OPTION_IP, ip)
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void setCorrector(@Nonnull User user, @Nonnull User moderator) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.SET_CORRECTOR.toString(),
ImmutableMap.of()
);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
public void unsetCorrector(@Nonnull User user, @Nonnull User moderator) {
jdbcTemplate.update(
"INSERT INTO user_log (userid, action_userid, action_date, action, info) VALUES (?,?,CURRENT_TIMESTAMP, ?::user_log_action, ?)",
user.getId(),
moderator.getId(),
UserLogAction.UNSET_CORRECTOR.toString(),
ImmutableMap.of()
);
}
}